#ifndef STRUCTS_H
#define STRUCTS_H

#include <cstdlib>
#include <cstdio>
#include <ctime>

typedef struct nodo{
  int tempo_chegada;
  nodo* proximo;
  nodo* anterior;
}Aluno;

typedef struct lista{
  Aluno* primeiro;
  Aluno* ultimo;
  int tamanho;
  int relogio;
  int atendentes;
  int total_atendidos;
  int tamanho_maximo;
  int espera_total;
  int total_alunos;
}Fila;

/* funcoes das estruturas */

Fila cria_fila_vazia(int atendentes){
  Fila ret;
  ret.tamanho = 0;
  ret.relogio = 0;
  ret.tamanho_maximo = 0;
  ret.total_alunos = 0;
  ret.espera_total = 0;
  ret.primeiro = NULL;
  ret.ultimo = NULL;
  ret.atendentes = atendentes;
  return ret;
}

//adiciona elemento ao final da fila
void adiciona(Fila* fila){
  Aluno* novo_elemento =(Aluno*) malloc(sizeof(Aluno));
  novo_elemento->tempo_chegada = fila->relogio;
  novo_elemento->proximo = NULL;

  if(fila->tamanho == 0){
      novo_elemento->anterior = fila->primeiro; //null
      novo_elemento->proximo = fila->ultimo; //null
      fila->primeiro = novo_elemento;
      fila->ultimo = novo_elemento;
  }
  else{
    novo_elemento->anterior = fila->ultimo;
    novo_elemento->proximo = NULL;
    fila->ultimo->proximo = novo_elemento;
    fila->ultimo = novo_elemento;
  }
  fila->total_alunos++;
  fila->tamanho++;
  if(fila->tamanho > fila->tamanho_maximo)
    fila->tamanho_maximo = fila->tamanho; 
}

//remove o primeiro elemento 
void remover(Fila* fila){
  if(fila->tamanho == 0)
    return;

  int tempo_espera = fila->relogio - fila->primeiro->tempo_chegada;
  fila->espera_total += tempo_espera;
  if(fila->tamanho > 1){
    fila->primeiro = fila->primeiro->proximo;
    free(fila->primeiro->anterior);
    fila->primeiro->anterior = NULL;
  }
  else{
    free(fila->primeiro);
    fila->primeiro = NULL;
    fila->ultimo = NULL;
  }
  fila->tamanho--;
}

//imprime tempo de espera dos alunos da fila
void imprime(Fila fila){
  Aluno* elemento_atual = fila.primeiro;
  printf("\n[ ");
  while(elemento_atual != NULL){
    int tempo_espera = fila.relogio - elemento_atual->tempo_chegada;
    int minutos = (tempo_espera)/60,
        segundos = (tempo_espera)%60;
    printf(" (%dmin %dseg)",minutos,segundos);
    elemento_atual = elemento_atual->proximo;
  }
  printf(" ]\n\n");
}

#endif // STRUCTS_H
